home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / oper_sys / amber / amber.lha / MoveThread.s < prev    next >
Text File  |  1991-04-25  |  13KB  |  655 lines

  1.     .verstamp    2 10
  2.     .data    
  3.     .align    2
  4.     .align    0
  5. $$7:
  6.     .word    1634027556 : 1
  7.     .word    980575588 : 1
  8.     .word    1635135264 : 1
  9.     .word    794898290 : 1
  10.     .word    1869181551 : 1
  11.     .word    1966040428 : 1
  12.     .word    1752444721 : 1
  13.     .word    1634429797 : 1
  14.     .word    1630496884 : 1
  15.     .word    1919246957 : 1
  16.     .word    1396920879 : 1
  17.     .word    1987005743 : 1
  18.     .word    1919439973 : 1
  19.     .word    778330469 : 1
  20.     .word    544615523 : 1
  21.     .word    540094001 : 1
  22.     .word    808398905 : 1
  23.     .word    842149688 : 1
  24.     .word    976630048 : 1
  25.     .word    876229685 : 1
  26.     .word    1752440885 : 1
  27.     .word    1634429797 : 1
  28.     .word    1159751796 : 1
  29.     .word    1277194360 : 1
  30.     .word    1701536623 : 1
  31.     .word    1948269170 : 1
  32.     .word    1802200424 : 1
  33.     .word    543716449 : 1
  34.     .word    36 : 1
  35.     .extern    _iob 60
  36.     .data    
  37.     .align    2
  38.     .align    0
  39. $$272:
  40.     .word    _Object_Size
  41.     .word    _Object_ChangeDescriptor
  42.     .word    _NamedObject_Error
  43.     .word    _NamedObject_Panic
  44.     .word    _Thread_Print
  45.     .word    _Thread__dtor
  46.     .word    _Thread_Start
  47.     .word    _Thread_WillJoin
  48.     .word    _Thread_WillNotJoin
  49.     .word    _Thread_Join
  50.     .word    _Thread_Terminate
  51.     .word    _Thread_Sleep
  52.     .word    _Thread_Wakeup
  53.     .word    _Thread_Run
  54.     .word    _Thread_FailedRPC
  55.     .word    0 : 1
  56.     .extern    systhread 4
  57.     .extern    errno 4
  58.     .extern    sys_errlist 0
  59.     .data    
  60.     .align    2
  61.     .align    0
  62. $$309:
  63.     .word    _Object_Size
  64.     .word    _Object_ChangeDescriptor
  65.     .word    _NamedObject_Error
  66.     .word    _NamedObject_Panic
  67.     .word    _Process_Print
  68.     .word    _Process_SchedThreadBody
  69.     .word    _Process_SchedLoop
  70.     .word    _Process__dtor
  71.     .word    _Process_NewProcess
  72.     .word    _Process_Start
  73.     .word    _Process_Die
  74.     .word    0 : 1
  75.     .extern    sys_nerr 4
  76.     .extern    _bufendtab 0
  77.     .data    
  78.     .align    2
  79.     .align    0
  80. $$57:
  81.     .word    _streambuf_overflow
  82.     .word    _streambuf_underflow
  83.     .word    0 : 1
  84.     .data    
  85.     .align    2
  86.     .align    0
  87. $$62:
  88.     .word    _filebuf_overflow
  89.     .word    _filebuf_underflow
  90.     .word    0 : 1
  91.     .data    
  92.     .align    2
  93.     .align    0
  94. $$320:
  95.     .word    _Object_Size
  96.     .word    _Object_ChangeDescriptor
  97.     .word    _NamedObject_Error
  98.     .word    _NamedObject_Panic
  99.     .word    _NamedObject_Print
  100.     .word    _ThreadPool__dtor
  101.     .word    _ThreadPool_get
  102.     .word    _ThreadPool_insert
  103.     .word    _ThreadPool_size
  104.     .word    0 : 1
  105.     .data    
  106.     .align    2
  107.     .align    0
  108. $$66:
  109.     .word    _circbuf_overflow
  110.     .word    _circbuf_underflow
  111.     .word    0 : 1
  112.     .data    
  113.     .align    2
  114.     .align    0
  115. $$326:
  116.     .word    _Object_Size
  117.     .word    _Object_ChangeDescriptor
  118.     .word    _NamedObject_Error
  119.     .word    _NamedObject_Panic
  120.     .word    _NamedObject_Print
  121.     .word    _ThreadPoolQueue__dtor
  122.     .word    _ThreadPoolQueue_get
  123.     .word    _ThreadPoolQueue_insert
  124.     .word    _ThreadPoolQueue_size
  125.     .word    0 : 1
  126.     .data    
  127.     .align    2
  128.     .align    0
  129. $$336:
  130.     .word    _Object_Size
  131.     .word    _Object_ChangeDescriptor
  132.     .word    _NamedObject_Error
  133.     .word    _NamedObject_Panic
  134.     .word    _Scheduler_Print
  135.     .word    _Scheduler__dtor
  136.     .word    _Scheduler_GetReadyThread
  137.     .word    _Scheduler_Enqueue
  138.     .word    _Scheduler_Tick
  139.     .word    _Scheduler_Arm
  140.     .word    _Scheduler_SetReadyPool
  141.     .word    0 : 1
  142.     .extern    sched 4
  143.     .extern    cin 12
  144.     .extern    cout 8
  145.     .data    
  146.     .align    2
  147.     .align    0
  148. $$353:
  149.     .ascii    "MakeInActive has an idle thread\X00"
  150.     .extern    cerr 8
  151.     .extern    WS 1
  152.     .data    
  153.     .align    2
  154.     .align    0
  155. $$355:
  156.     .ascii    "movebaseframe botched\X00"
  157.     .data    
  158.     .align    2
  159.     .align    0
  160. $$168:
  161.     .word    _Object_Size
  162.     .word    _Object_ChangeDescriptor
  163.     .word    0 : 1
  164.     .data    
  165.     .align    2
  166.     .align    0
  167. $$190:
  168.     .word    _Object_Size
  169.     .word    _Object_ChangeDescriptor
  170.     .word    _NamedObject_Error
  171.     .word    _NamedObject_Panic
  172.     .word    _NamedObject_Print
  173.     .word    0 : 1
  174.     .data    
  175.     .align    2
  176.     .align    0
  177. $$194:
  178.     .word    _Object_Size
  179.     .word    _Object_ChangeDescriptor
  180.     .word    _NamedObject_Error
  181.     .word    _NamedObject_Panic
  182.     .word    _NamedObject_Print
  183.     .word    0 : 1
  184.     .extern    thisnode 4
  185.     .extern    AmberState 4
  186.     .data    
  187.     .align    2
  188.     .align    0
  189. $$217:
  190.     .word    _Object_Size
  191.     .word    _Object_ChangeDescriptor
  192.     .word    0 : 1
  193.     .extern    stacksize 4
  194.     .extern    spmask 4
  195.     .data    
  196.     .align    2
  197.     .align    0
  198. $$227:
  199.     .word    $$226
  200.     .word    _Object_ChangeDescriptor
  201.     .word    0 : 1
  202.     .data    
  203.     .align    2
  204.     .align    0
  205. $$232:
  206.     .word    _Object_Size
  207.     .word    _Object_ChangeDescriptor
  208.     .word    0 : 1
  209.     .data    
  210.     .align    2
  211.     .align    0
  212. $$237:
  213.     .word    _Object_Size
  214.     .word    _Object_ChangeDescriptor
  215.     .word    _NamedObject_Error
  216.     .word    _NamedObject_Panic
  217.     .word    _NamedObject_Print
  218.     .word    0 : 1
  219.     .data    
  220.     .align    2
  221.     .align    0
  222. $$240:
  223.     .word    _Object_Size
  224.     .word    _Object_ChangeDescriptor
  225.     .word    _NamedObject_Error
  226.     .word    _NamedObject_Panic
  227.     .word    _ObjectList_Print
  228.     .word    0 : 1
  229.     .data    
  230.     .align    2
  231.     .align    0
  232. $$254:
  233.     .word    _Object_Size
  234.     .word    _Object_ChangeDescriptor
  235.     .word    _WiredThreadState_Print
  236.     .word    0 : 1
  237.     .text    
  238.     .align    2
  239.     .file    2 "MoveThread.c"
  240.     .globl    ThreadArrived
  241.     .loc    2 14
  242.  #  14    {
  243.     .ent    ThreadArrived 2
  244. ThreadArrived:
  245.     .option    O2
  246.     subu    $sp, 32
  247.     sw    $31, 28($sp)
  248.     sw    $16, 24($sp)
  249.     .mask    0x80010000, -4
  250.     .frame    $sp, 32, $31
  251.     sw    $4, 32($sp)
  252.     .loc    2 17
  253.  #  15        Thread* movedThread;
  254.  #  16    
  255.  #  17        movedThread = (Thread*)((unsigned)threadBody - 4);
  256.     .loc    2 20
  257.  #  18    //        pout("thread 0x%x has arrived and is %s",
  258.  #  19    //             movedThread, movedThread->IsActive()? "Active" : "Inactive");
  259.  #  20        LockDescriptors();
  260.     .livereg    0xff0e,0xfff
  261.     jal    LockDescriptors
  262.     .loc    2 21
  263.  #  21        ObjectArrived(movedThread);
  264.     lw    $16, 32($sp)
  265.     addu    $16, $16, -4
  266.     move    $4, $16
  267.     .livereg    0x800ff0e,0xfff
  268.     jal    ObjectArrived
  269.     .loc    2 22
  270.  #  22        UnlockDescriptors();
  271.     .livereg    0xff0e,0xfff
  272.     jal    UnlockDescriptors
  273.     .loc    2 24
  274.  #  23    //      *thread_data((unsigned)movedThread->StackTop()) = movedThread;;
  275.  #  24            if (movedThread->IsActive()) {
  276.     lw    $3, 96($16)
  277.     and    $2, $3, 128
  278.     beq    $2, $0, $33
  279.     .loc    2 27
  280.  #  25                    // From the time this was marked inactive it 
  281.  #  26                    // could have been interrupted to do an RPC
  282.  #  27                    movedThread->MakeInactive();
  283.     bne    $2, 0, $32
  284.     move    $4, $16
  285.     la    $5, $$353
  286.     move    $6, $0
  287.     move    $7, $0
  288.     .livereg    0xf00ff0e,0xfff
  289.     lw    $14, 12($16)
  290.     lw    $15, 12($14)
  291.     jal    $15
  292.     lw    $3, 96($16)
  293. $32:
  294.     and    $2, $3, -129
  295.     sw    $2, 96($16)
  296.     .loc    2 28
  297.  #  28            }
  298. $33:
  299.     .loc    2 29
  300.  #  29        movedThread->Enreadyq();
  301.     move    $4, $16
  302.     .livereg    0x800ff0e,0xfff
  303.     jal    _Thread_Enreadyq
  304.     .loc    2 31
  305.  #  30    
  306.  #  31        return 0;
  307.     move    $2, $0
  308.     lw    $16, 24($sp)
  309.     lw    $31, 28($sp)
  310.     addu    $sp, 32
  311.     j    $31
  312.     .end    ThreadArrived
  313.     .text    
  314.     .align    2
  315.     .file    2 "MoveThread.c"
  316.     .globl    _Object_FetchThisThread
  317.     .loc    2 43
  318.  #  43    {
  319.     .ent    _Object_FetchThisThread 2
  320. _Object_FetchThisThread:
  321.     .option    O2
  322.     subu    $sp, 72
  323.     sw    $31, 44($sp)
  324.     sw    $20, 40($sp)
  325.     sd    $18, 32($sp)
  326.     sd    $16, 24($sp)
  327.     .mask    0x801F0000, -28
  328.     .frame    $sp, 72, $31
  329.     move    $19, $4
  330.     sw    $5, 76($sp)
  331.     .loc    2 48
  332.  #  44        struct MoveThreadArgs args;
  333.  #  45        Thread *me;
  334.  #  46    
  335.  #  47    
  336.  #  48        me = thisthread;
  337.     .livereg    0xff0e,0xfff
  338.     jal    mythread_data
  339.     lw    $16, 0($2)
  340.     .loc    2 49
  341.  #  49            me->NonPreemptable();
  342.     lw    $14, 116($16)
  343.     addu    $15, $14, 1
  344.     sw    $15, 116($16)
  345.     .loc    2 50
  346.  #  50        me->DisableChecks();
  347.     lw    $24, 112($16)
  348.     addu    $25, $24, 1
  349.     sw    $25, 112($16)
  350.     .loc    2 52
  351.  #  51    
  352.  #  52            moveBaseFrame = me->GetMoveBaseFrame();
  353.     move    $4, $16
  354.     .livereg    0x800ff0e,0xfff
  355.     jal    _Thread_GetMoveBaseFrame
  356.     sw    $2, 76($sp)
  357.     .loc    2 61
  358.  #  61        LockDescriptors();
  359.     .livereg    0xff0e,0xfff
  360.     jal    LockDescriptors
  361.     .loc    2 62
  362.  #  62        this->AwaitTransfer();
  363.     move    $4, $19
  364.     .livereg    0x800ff0e,0xfff
  365.     jal    _Object_AwaitTransfer
  366.     .loc    2 63
  367.  #  63        me->CheckAnchor();
  368.     move    $4, $16
  369.     .livereg    0x800ff0e,0xfff
  370.     jal    _Thread_CheckAnchor
  371.     li    $17, -2147483648
  372.     li    $20, 1073741824
  373.     .loc    2 64
  374.  #  64        me->ChangeDescriptor(DFLocal, DFMoving);
  375.     move    $4, $16
  376.     move    $5, $17
  377.     move    $6, $20
  378.     .livereg    0xe00ff0e,0xfff
  379.     lw    $8, 12($16)
  380.     lw    $9, 4($8)
  381.     jal    $9
  382.     .loc    2 65
  383.  #  65        UnlockDescriptors();
  384.     .livereg    0xff0e,0xfff
  385.     jal    UnlockDescriptors
  386.     .loc    2 69
  387.  #  66    
  388.  #  67        // Move thread and frames to target node.
  389.  #  68        //
  390.  #  69        args.thread = me;
  391.     sw    $16, 56($sp)
  392.     .loc    2 70
  393.  #  70        args.moveBaseFrame = (char *)moveBaseFrame;
  394.     lw    $10, 76($sp)
  395.     sw    $10, 60($sp)
  396.     .loc    2 71
  397.  #  71        args.targetObject = this;
  398.     sw    $19, 64($sp)
  399.     .loc    2 72
  400.  #  72        args.arrivalFunc = ThreadArrived;
  401.     la    $11, ThreadArrived
  402.     sw    $11, 68($sp)
  403.     addu    $18, $sp, 56
  404. $34:
  405.     .loc    2 75
  406.  #  73    
  407.  #  74        for (;;) {
  408.  #  75            while (!this->IsLocal()) {
  409.     lw    $12, 0($19)
  410.     and    $13, $12, $17
  411.     bne    $13, $0, $36
  412. $35:
  413.     .loc    2 76
  414.  #  76                me->SetMoveArgs((char *)&args);
  415.     sw    $18, 128($16)
  416.     .loc    2 78
  417.  #  77    //                        pout("calling for remote switch at 0x%x",me); 
  418.  #  78                me->Switch();
  419.     move    $4, $16
  420.     .livereg    0x800ff0e,0xfff
  421.     jal    _Thread_Switch
  422.     .loc    2 79
  423.  #  79            }
  424.     .loc    2 79
  425.     lw    $14, 0($19)
  426.     and    $15, $14, $17
  427.     beq    $15, $0, $35
  428. $36:
  429.     .loc    2 82
  430.  #  80    // Now that we are copying the entire stack we don't need this
  431.  #  81    //        thisthread = me; 
  432.  #  82            LockDescriptors();
  433.     .livereg    0xff0e,0xfff
  434.     jal    LockDescriptors
  435.     .loc    2 83
  436.  #  83            if (this->IsLocal())
  437.     lw    $24, 0($19)
  438.     and    $25, $24, $17
  439.     bne    $25, $0, $37
  440.     .loc    2 84
  441.  #  84                break;        // with lock held
  442.     .loc    2 89
  443.  #  85            else {
  444.  #  86                //
  445.  #  87                // Oops, it moved again.  Keep chasing it.
  446.  #  88                //
  447.  #  89                this->AwaitTransfer();
  448.     move    $4, $19
  449.     .livereg    0x800ff0e,0xfff
  450.     jal    _Object_AwaitTransfer
  451.     .loc    2 90
  452.  #  90                me->CheckAnchor();
  453.     move    $4, $16
  454.     .livereg    0x800ff0e,0xfff
  455.     jal    _Thread_CheckAnchor
  456.     .loc    2 91
  457.  #  91                me->ChangeDescriptor(DFLocal, DFMoving);
  458.     move    $4, $16
  459.     move    $5, $17
  460.     move    $6, $20
  461.     .livereg    0xe00ff0e,0xfff
  462.     lw    $8, 12($16)
  463.     lw    $9, 4($8)
  464.     jal    $9
  465.     .loc    2 92
  466.  #  92                UnlockDescriptors();
  467.     .livereg    0xff0e,0xfff
  468.     jal    UnlockDescriptors
  469.     .loc    2 93
  470.  #  93            }
  471.     .loc    2 94
  472.  #  94        }
  473.     b    $34
  474. $37:
  475.     .loc    2 101
  476.  # 101        if (moveBaseFrame != me->StackBaseFrame()) {
  477.     lw    $10, 76($sp)
  478.     lw    $11, 132($16)
  479.     beq    $10, $11, $38
  480.     .loc    2 102
  481.  # 102                    Panic("movebaseframe botched");
  482.     la    $4, $$355
  483.     .livereg    0x800ff0e,0xfff
  484.     jal    Panic
  485.     .loc    2 103
  486.  # 103            }
  487. $38:
  488.     .loc    2 114
  489.  # 114        me->EnableChecks();
  490.     lw    $12, 112($16)
  491.     addu    $13, $12, -1
  492.     sw    $13, 112($16)
  493.     .loc    2 115
  494.  # 115        UnlockDescriptors();
  495.     .livereg    0xff0e,0xfff
  496.     jal    UnlockDescriptors
  497.     .loc    2 116
  498.  # 116        me->Preemptable();
  499.     lw    $14, 116($16)
  500.     addu    $15, $14, -1
  501.     sw    $15, 116($16)
  502.     .loc    2 117
  503.  # 117    }
  504.     ld    $16, 24($sp)
  505.     ld    $18, 32($sp)
  506.     lw    $20, 40($sp)
  507.     lw    $31, 44($sp)
  508.     addu    $sp, 72
  509.     j    $31
  510.     .end    _Object_FetchThisThread
  511.     .text    
  512.     .align    2
  513.     .file    2 "MoveThread.c"
  514.     .globl    DoThreadMove
  515.     .loc    2 136
  516.  # 136    {
  517.     .ent    DoThreadMove 2
  518. DoThreadMove:
  519.     .option    O2
  520.     subu    $sp, 120
  521.     sw    $31, 36($sp)
  522.     sw    $16, 32($sp)
  523.     .mask    0x80010000, -84
  524.     .frame    $sp, 120, $31
  525.     move    $8, $4
  526.     .loc    2 141
  527.  # 137        ThreadRPCDescription threadDesc;
  528.  # 138        char* stackTop;
  529.  # 139        int destNode;
  530.  # 140        int invokeCount;
  531.  # 141        Thread *thread = args->thread;
  532.     lw    $16, 0($8)
  533.     .loc    2 143
  534.  # 142    
  535.  # 143        invokeCount = thread->CountMove();
  536.     lw    $2, 8($16)
  537.     addu    $2, $2, 1
  538.     sw    $2, 8($16)
  539.     sw    $2, 60($sp)
  540.     .loc    2 152
  541.  # 152                    sizeof(Thread) - (sizeof(WiredThreadState) + 4); // XXX
  542.     li    $14, 208
  543.     sw    $14, 76($sp)
  544.     .loc    2 153
  545.  # 153        threadDesc.threadPart.datum = (char*)((unsigned)thread + 4);
  546.     addu    $3, $16, 4
  547.     sw    $3, 84($sp)
  548.     .loc    2 154
  549.  # 154        threadDesc.threadPart.destAddr = (char*)((unsigned)thread + 4);
  550.     sw    $3, 88($sp)
  551.     .loc    2 155
  552.  # 155        threadDesc.threadPart.next = &(threadDesc.stackPart);
  553.     addu    $15, $sp, 96
  554.     sw    $15, 92($sp)
  555.     .loc    2 157
  556.  # 156    
  557.  # 157        stackTop = thread->StackTop();
  558.     move    $4, $16
  559.     sw    $8, 120($sp)
  560.     .livereg    0x800ff0e,0xfff
  561.     jal    _Thread_StackTop
  562.     lw    $8, 120($sp)
  563.     .loc    2 160
  564.  # 158            // copy the entire stack AND the thisthread slot as well.
  565.  # 159        threadDesc.stackPart.length = args->moveBaseFrame - stackTop + 
  566.  # 160                                                     2 * sizeof(int);
  567.     lw    $24, 4($8)
  568.     subu    $25, $24, $2
  569.     addu    $9, $25, 8
  570.     sw    $9, 100($sp)
  571.     .loc    2 161
  572.  # 161        threadDesc.stackPart.datum = stackTop;        // stack grows down
  573.     sw    $2, 108($sp)
  574.     .loc    2 162
  575.  # 162        threadDesc.stackPart.destAddr = stackTop;
  576.     sw    $2, 112($sp)
  577.     .loc    2 163
  578.  # 163        threadDesc.stackPart.next = 0;
  579.     sw    $0, 116($sp)
  580.     .loc    2 169
  581.  # 164    
  582.  # 165        //
  583.  # 166        // Move the thread and stack.
  584.  # 167        //
  585.  # 168        destNode = MoveData((RPCDatum*)&threadDesc, args->targetObject,
  586.  # 169                args->arrivalFunc, thread);
  587.     addu    $4, $sp, 72
  588.     lw    $5, 8($8)
  589.     lw    $6, 12($8)
  590.     move    $7, $16
  591.     .livereg    0xf00ff0e,0xfff
  592.     jal    MoveData
  593.     sw    $2, 64($sp)
  594.     .loc    2 171
  595.  # 170    
  596.  # 171        if ((destNode != thisnode->NodeNum()) &&
  597.     lw    $4, thisnode
  598.     .livereg    0x800ff0e,0xfff
  599.     jal    _Node_NodeNum
  600.     lw    $10, 64($sp)
  601.     beq    $10, $2, $40
  602.     lw    $11, 60($sp)
  603.     lw    $12, 8($16)
  604.     bne    $11, $12, $40
  605.     .loc    2 173
  606.  # 172            (invokeCount == thread->GetMoveCount())) {
  607.  # 173            LockDescriptors();
  608.     .livereg    0xff0e,0xfff
  609.     jal    LockDescriptors
  610.     .loc    2 174
  611.  # 174            if (invokeCount == thread->GetMoveCount())
  612.     lw    $13, 60($sp)
  613.     lw    $14, 8($16)
  614.     bne    $13, $14, $39
  615.     .loc    2 175
  616.  # 175                ObjectDeparted(thread, destNode);
  617.     move    $4, $16
  618.     lw    $5, 64($sp)
  619.     .livereg    0xc00ff0e,0xfff
  620.     jal    ObjectDeparted
  621. $39:
  622.     .loc    2 180
  623.  # 176                // Wait a second, can't we get a missed wakeup here if we
  624.  # 177                // don't call ObjectDeparted?  It's true we don't want to
  625.  # 178                // mark the descriptor, but we probably do want to do a
  626.  # 179                // TransferComplete.  XXX
  627.  # 180            UnlockDescriptors();
  628.     .livereg    0xff0e,0xfff
  629.     jal    UnlockDescriptors
  630.     .loc    2 181
  631.  # 181        }
  632.     .loc    2 182
  633.  # 182    }
  634. $40:
  635.     lw    $16, 32($sp)
  636.     lw    $31, 36($sp)
  637.     addu    $sp, 120
  638.     j    $31
  639.     .end    DoThreadMove
  640.     .text    
  641.     .align    2
  642.     .file    2 "MoveThread.c"
  643.     .loc    2 185
  644.  # 183    
  645.  # 184    
  646.  # 185    
  647.     .ent    $$226 2
  648. $$226:
  649.     .option    O2
  650.     .frame    $sp, 0, $31
  651.     .loc    2 185
  652.     lw    $2, 20($4)
  653.     j    $31
  654.     .end    _Stack_Size
  655.